﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     2.0
**Author:      hujiarui
**Date:        2023/06/28
**Description: Item基类
*****************************************************/

#ifndef BASEGRAPHICSITEM_H
#define BASEGRAPHICSITEM_H

#include "../../ofuidll_global.h"

#include <QObject>
#include <QGraphicsItem>
#include <QPen>
#include <QFont>
#include <QCursor>

namespace OfUI {

	enum MouseDragType;
	class OFUIDLL_EXPORT BaseGraphicsItem : public QObject, public QGraphicsItem
	{
		Q_OBJECT
			Q_INTERFACES(QGraphicsItem)

	public:
		/**
		 * @brief  Item状态
		 */
		enum ItemState
		{
			STATE_NORMAL,       ///< 普通状态
			STATE_SELECT,       ///< 选中状态
			STATE_DISABLE       ///< 禁用状态
		};

		/**
		 * @brief  鼠标拖拽类型
		 */
		enum MouseDragType
		{
			DRAG_NONE,          ///< 不拖拽
			DRAG_EDIT,          ///< 拖拽编辑
			DRAG_MOVE           ///< 拖拽移动
		};

	public:
		/**
		 * @brief  BaseGraphicsItem 构造函数
		 * @param  parent
		 * @return
		 */
		BaseGraphicsItem(QGraphicsItem *parent = 0);

		/**
		 * @brief  ~BaseGraphicsItem 析构函数
		 * @return
		 */
		virtual ~BaseGraphicsItem();

	public:
		/**
		 * @brief  getId 获取唯一ID
		 * @return int
		 */
		int getId() const;

		/**
		 * @brief  setZValue 设置ZValue
		 * @param  value
		 * @return void
		 */
		void setZValue(qreal value);

		/**
		 * @brief  setType 设置Item类型
		 * @param  nType
		 * @return void
		 */
		void setType(int nType);

		/**
		 * @brief  getType 获取Item类型
		 * @return int
		 */
		int getType() const;

		/**
		 * @brief  setState 设置Item状态
		 * @param  state
		 * @return void
		 */
		void setState(const ItemState& state);

		/**
		 * @brief  getState 获取Item状态
		 * @return BaseGraphicsItem::ItemState
		 */
		ItemState getState() const;

		/**
		 * @brief  setViewScale 设置视图放大倍数
		 * @param  dScale
		 * @return void
		 */
		void setViewScale(double dScale);

		/**
		 * @brief  getViewScale 获取视图放大倍数
		 * @return double
		 */
		double getViewScale() const;

		/**
		 * @brief  setFont 设置字体
		 * @param  font
		 * @return void
		 */
		void setFont(const QFont& font);

		/**
		 * @brief  getFont 获取字体
		 * @return QFont
		 */
		QFont getFont() const;

		/**
		 * @brief  setPen 设置画笔
		 * @param  eState
		 * @param  pen
		 * @return void
		 */
		void setPen(const ItemState& eState, const QPen& pen);

		/**
		 * @brief  getPen 获取画笔
		 * @param  eState
		 * @return QPen
		 */
		QPen getPen(const ItemState& eState) const;

	public:
		/**
		 * @brief  isAdding 判断是否正在添加
		 * @return bool
		 */
		virtual bool isAdding() const;

		/**
		 * @brief  isEditing 判断是否正在编辑
		 * @return bool
		 */
		virtual bool isEditing() const;

		/**
		 * @brief  isVaild 判断是否有效
		 * @return bool
		 */
		virtual bool isVaild() const;

		/**
		 * @brief  select 坐标选择拖拽类型
		 * @param  point
		 * @param  selType
		 * @return BaseGraphicsItem::MouseDragType
		 */
		virtual MouseDragType select(const QPointF& point, int* selType = nullptr) const;

		/**
		 * @brief  cursor 坐标位置设置光标
		 * @param  point
		 * @param  cursor
		 * @return void
		 */
		virtual void cursor(const QPointF& point, QCursor& cursor) const;

		/**
		 * @brief  mousePressEvent 鼠标按下事件
		 * @param  event
		 * @return void
		 */
		virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);

		/**
		 * @brief  mouseReleaseEvent 鼠标弹起事件
		 * @param  event
		 * @return void
		 */
		virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

		/**
		 * @brief  mouseMoveEvent 鼠标移动事件
		 * @param  event
		 * @return void
		 */
		virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

		/**
		 * @brief  mouseDoubleClickEvent 鼠标双击事件
		 * @param  event
		 * @return void
		 */
		virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);

		/**
		 * @brief  focusOutEvent 失焦事件
		 * @param  event
		 * @return void
		 */
		virtual void focusOutEvent(QFocusEvent *event);

	Q_SIGNALS:
		/**
		 * @brief  signalAddFinished 添加完成信号
		 * @return void
		 */
		void signalAddFinished();

		/**
		 * @brief  signalDestroyed 销毁信号
		 * @return void
		 */
		void signalDestroyed();

		/**
		 * @brief  signalStateChanged 状态变化信号
		 * @param  state
		 * @return void
		 */
		void signalStateChanged(int state);

		/**
		 * @brief  signalDataChanged 数据变化信号
		 * @return void
		 */
		void signalDataChanged();

	private:
		/** 唯一ID
		 */
		int m_nId;

		/** Item类型
		 */
		int m_nType;

		/** Item状态
		 */
		ItemState m_eItemState;

		/** 视图放大倍数
		 */
		double m_dViewScale;

		/** 字体
		 */
		QFont m_font;

		/** 画笔
		 */
		QMap<ItemState, QPen> m_penMap;
	};

}

#endif // BASEGRAPHICSITEM_H